package com.javaapi.jdk5.generics;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 1、泛型
 * <p>
 * 所谓类型擦除指的就是Java源码中的范型信息只允许停留在编译前期，而编译后的字节码文件中将不再保留任何的范型信息。
 * 也就是说，范型信息在编译时将会被全部删除，其中范型类型的类型参数则会被替换为Object类型，并在实际使用时强制转换为指定的目标数据类型。
 * 而C++中的模板则会在编译时将模板类型中的类型参数根据所传递的指定数据类型生成相对应的目标代码。
 * * 功能：泛型
 * C++通过模板技术可以指定集合的元素类型，
 * 而Java在1.5之前一直没有相对应的功能。
 * 一个集合可以放任何类型的对象，
 * 相应地从集合里面拿对象的时候我们也不得不对他们进行强制得类型转换。
 * 猛虎引入了泛型，它允许指定集合里元素的类型，
 * 这样你可以得到强类型在编译时刻进行类型检查的好处。
 *
 * 泛型，即“参数化类型”。一提到参数，最熟悉的就是定义方法时有形参，然后调用此方法时传递实参。
 * 那么参数化类型怎么理解呢？顾名思义，就是将类型由原来的具体的类型参数化，类似于方法中的变量参数，此时类型也定义成参数形式（可以称之为类型形参），
 * 然后在使用/调用时传入具体的类型（类型实参）。
 *
 * http://blog.csdn.net/djun100/article/details/18084607
 */
public class GenericsTest {
    public static void jdk14() {
        //相当于15中的List<Object> list = new ArrayList<Object>();
        List list = new ArrayList();
        list.add("1");//我们现在在list中添加了一个字符串类型
        String s = (String) list.get(0);//需要强转
        list.add(new Date());//我们还可以添加一个Date类型
    }

    public static void jdk15() {
        List<String> list = new ArrayList<String>();
        list.add("1");
        String s = list.get(0);//不需要强转
        //list.add(new Date());//编译不通过
    }
}
